<?php

    /**
     * Abstract
     *
	 * @package      Core
     * @subpackage   Url
     *
     * @license      GNU Lesser General Public Licence see LICENCE-LGPL file or http://www.gnu.org/licenses/lgpl.html
     */
    abstract class Core_Url_Abstract extends Core_Object
    {

    ////////////////////////////////////////////////////////////////////////////
	//                                Variables                               //
	////////////////////////////////////////////////////////////////////////////

        /**
         * Instance parameters
         *
         * @var array
         */
        protected $_params = array();

	////////////////////////////////////////////////////////////////////////////
	//                            Getters / Setters                           //
	////////////////////////////////////////////////////////////////////////////

        /**
         * Gets a parameter value
         *
         * @param       string      $param : parameter name
         * @param       string      $defaultValue : the default value returned if the parameter doesn't exists
		 * @throws		Core_ArgumentException
		 * @throws		Core_ArgumentNullException
         * @return      string      the value
         */
        public function getParam($param, $defaultValue = null)
        {
            if ($param === null) {
				throw new Core_ArgumentNullException('param is a null reference');
			}

            if (strlen(trim($param)) == 0) {
				throw new Core_ArgumentException('param is a zero-length string');
			}

            return array_key_exists($param, $this->_params) ? $this->_params[$param] : $defaultValue;
        }

        /**
         * Gets all parameters
         *
         * @return       array
         */
        public function getParams()
        {
            return $this->_params;
        }

        /**
         * Adds or changes the value of a parameter
         *
         * @param       string      $param : parameter name
         * @param       string      $value : parameter value
		 * @throws		Core_ArgumentException
		 * @throws		Core_ArgumentNullException
         * @return      Core_Url_Abstract
         */
        public function setParam($param, $value)
        {
            if ($param === null) {
				throw new Core_ArgumentNullException('param is a null reference');
			}

            if (strlen(trim($param)) == 0) {
				throw new Core_ArgumentException('param is a zero-length string');
			}

            $this->_params[$param] = $value;
            return $this;
        }

	////////////////////////////////////////////////////////////////////////////
	//                                 Methods                                //
	////////////////////////////////////////////////////////////////////////////

        /**
         * Deletes a parameter
         *
         * @param       string      $param : parameter name
		 * @throws		Core_ArgumentException
		 * @throws		Core_ArgumentNullException
         * @return      void
         */
        public function deleteParam($param)
        {
            if ($param === null) {
				throw new Core_ArgumentNullException('param is a null reference');
			}

            if (strlen(trim($param)) == 0) {
				throw new Core_ArgumentException('param is a zero-length string');
			}

            if (array_key_exists($param, $this->_params)) {
                unset($this->_params[$param]);
            }
        }

        /**
         * Clears all parameters
         *
         * @return       void
         */
        public function clearParam()
        {
            $this->_params = array();
        }

        /**
         * Magic method for echo and others...
         *
         * @return      string
         */
        public function __toString()
        {
            return $this->_toString();
        }

	////////////////////////////////////////////////////////////////////////////
	//                       Abstract Protected Methods                       //
	////////////////////////////////////////////////////////////////////////////

        /**
		 * Gets the url string corresponding to the url/action
		 *
		 * @param       boolean     $forxml : true if some characters should be escaped
		 * @return      string
         */
        abstract protected function _toString($forxml = false);
   }
